/**
 * UniApp 请求封装
 * @param {Object} config - 请求配置对象
 * @param {string} config.url - 请求接口路径（必填，如 '/api/user'）
 * @param {string} [config.method='GET'] - 请求方法（GET/POST/PUT/DELETE 等）
 * @param {Object} [config.params] - 请求参数（GET 拼接到 url，POST 作为请求体）
 * @returns {Promise} 响应数据或错误信息
 */
import api from "@/config/api.js";
import storage from "@/utils/storage.js"; //缓存
const request = (config) => {
	// 解构配置参数（必传 url，其他参数有默认值）
	const {
		url,
		method = 'GET',
		params = {}
	} = config;

	// 校验必填参数
	if (!url) {
		return Promise.reject(new Error('请求 url 不能为空'));
	}

	// 基础配置
	const baseUrl = api.buyer; // 接口基础地址
	const fullUrl = baseUrl + url; // 完整请求地址
	const requestMethod = method.toUpperCase(); // 统一转为大写

	// 请求头（可添加 token 等全局信息）
	const header = {
		'Content-Type': 'application/json',
		'ba-user-token': storage.getAccessToken() || '' // 示例：携带 token
	};

	// 处理 GET 请求参数（拼接到 url）
	let finalUrl = fullUrl;
	if (requestMethod === 'GET' && Object.keys(params).length) {
		const queryStr = Object.entries(params)
			.map(([key, val]) => `${encodeURIComponent(key)}=${encodeURIComponent(val)}`)
			.join('&');
		finalUrl += (finalUrl.includes('?') ? '&' : '?') + queryStr;
	}

	// 发起请求
	return new Promise((resolve, reject) => {
		uni.request({
			url: finalUrl,
			method: requestMethod,
			// POST/PUT 等方法的参数放在 data 中
			data: requestMethod !== 'GET' ? params : {},
			header,
			success: (res) => {
				const {
					statusCode,
					data
				} = res;
				// 成功：状态码 200-299（根据后端实际情况调整）
				if (statusCode >= 200 && statusCode < 300 && data.code == 1 || data.code == 0) {
					// 若后端有统一响应格式（如 { code, data, msg }），可在此处理
					// 示例：if (data.code !== 0) return reject(data.msg)
					resolve(data);
				} else if (data.code == 409 || data.code == 303) {
					uni.redirectTo({
						url: '/pages/passport/login'
					})
				} else {
					// 失败：非成功状态码
					reject(data);
				}
			},
			fail: (err) => {
				// 网络错误（如断网、超时）
				reject(new Error(`网络错误：${err.errMsg}`));
			}
		});
	});
};
const Method = {
	GET: "GET",
	POST: "POST",
	PUT: "PUT",
	DELETE: "DELETE",
};
export {
	request,
	Method
};